教你6步绘制青岛地铁线路图

随着2021年12月30日青岛地铁1号线南段正式开通运营,青黄不接再一次告别历史,隧道+地铁的双线交通必将青黄拉得更近了。青岛地铁运营里程也来到了293.1公里,跻身大陆城市地铁排名10强,但由于11和13号线郊区段较长,外加疫情原因导致机场8号线客流较少,导致青岛地铁虽然里程排名第10,但客流强度一直感人。

借由青岛地铁1号线南段开通之际及部分微信群友们对最新版地铁线路图的渴求,作为一个入门级GIS爱好者决定试一试,画一份最新版地铁线路图供大家参考。主要目标为按照青岛地铁标准配色叠加地形图或街道图绘制带站名的地铁线路图,并保存为png或jpg格式以方便保存共享

经过近2个月的摸鱼,知道了ShapefileGeoJSON文件格式及QGIS等一众工具,并最终从OpenStreetMap网站下载到了全国矢量数据,导入QGIS后初步确认数据包含青岛地铁1号线南段。然后从https://hxkj.vip/demo/echartsMap/ 网站获取了最新版青岛市区划geojson数据。这样后续用到的基础数据基本齐了。

然后就是可视化工具的选择,结合2020年疫情回国隔离期间学习绘制归国航迹路线图的经历,首先尝试Folium库,但由于无法将地图保存为静态图,遂放弃。matplotlib+basemap组合由于底图不够清晰,遂放弃。然后又搜到了geopandas,在pandas基础上添加了geometry属性,便于储存和处理矢量数据,研究学习发现可以很好的满足线路轮廓的绘制,而且数据处理起来也非常方便,剩下的就是如何叠加底图了,在此要感谢这篇博文geopandas轻松叠加在线底图,从中学到了contextily库,完美解决了底图问题。

数据和绘制方案确定后,下面就到了动手撸码环节了。

00 导入要用到的工具库

以下为解决matplotlib中文乱码的配置方案,WSL下完整解决方案可参考wsl安装字体与配置mlt

01 数据处理及首次绘图尝试

由于contextily库要求投影为web墨卡托即EPSG:3857,因此在数据读取环节需要变换crs,但采用EPSG:3857geopandasgeometry将不再是显性的经纬度坐标,如果不需要叠加底图的小伙伴可以取消转换。

通过fclass等于subway来筛选地铁线路

初步选取青岛地铁线路,此处有一点需要注意,鉴于各地对地铁名称上的区别,上述name属性值中有青岛地铁XX线或上海轨道交通XX线或首都机场线甚至None(空值)等名称,确切的说在总计15754行数据中非空值仅为3883行。。。因此建议直接按name属性包含城市来筛选某一城市的地铁线路。后面会有更方便的方法筛选某一城市的地铁线路。

以上我们可以看到经过初步筛选后的数据中并没有包含青岛地铁3号线,因此对3号线要进行特殊处理。

对青岛市经纬度范围熟悉的话,我们可以人肉筛选出osm_id = 256679071的三号线可能为青岛地铁号线。

读取青岛市区划范围,便于展示地铁线路在各区县的分布情况。

经过上述数据处理后,下面开始首次尝试绘制青岛地铁图,既然属于GIS范畴,我们就以叠加地形图为主。

通过上图我们可以看到线路轮廓大致与真实路线一致,但由于线路数据的重叠,导致各线路粗细不均。不过好歹我们完成了第一步。下面我们将不断在此基础上进行改进。

02 name属性空值处理

借助geopandasclip函数,我们可以裁切geo_data_qingdao范围内的metro_data数据。

看下这些name为None的线路都是什么。

目测主要应该是些停车场之类的,对主干线路绘图影响有限,可以忽略。

对青岛地铁而言,由于存在跨海段,且跨海段不在geo_data_qingdao范围内,因此clip裁切后的地铁线路存在跨海段缺失的问题。所以,后面我们还得继续使用上一步通过字段筛选得到的geo_data_qingdao

这样metro_data_qingdao_all就包含了要绘制的所有数据。

03 地铁线路配色

以上2步我们重点探讨了如何进行数据处理,同时用单一色彩蓝色绘制出了青岛地铁线路图。我们能否根据青岛地铁线路标准配色来为我们的线路进行上色呢?为此我们首先要把地铁线路名称进行统一。

通过在geopandas.plot()方法中设置column='name'categorical=Truegeopandas.plot()会根据column列的不同值进行自动配色。

感谢这篇博文Lesson 2. Customize Map Legends and Colors in Python using Matplotlib: GIS in Python提供的自定义配色的现成方法。青岛地铁线路标准配色可参考青岛地铁颜色

这样我们就按照标准配色绘制出了青岛地铁线路图了,由于空值线路缺失影响不大,因此未在图中绘制。

04 地铁线路叠加其他城市数据

由于地铁线路与地区GDP和人口存在一定的关联性,我们自然会想能否将地铁线路与一座城市的其他数据进行叠加可视化呢?基于此想法,我们选取青岛市各区县GDP、人均GDP,常住人口及人口密度4项数据进行叠加。

同时对上述4项数据进行叠加

05 地铁站点标注

添加地铁站点标注后,需要根据字体重叠情况对画布大小和标注字体字号进行调整,以便尽可能消除站点名称的重叠现象。

我们看到上图存在许多并不属于地铁站的国铁火车站,因此我们可以先保存图片然后人肉进行逐个站点的清除。以下分别用metro_data_qingdao_stations_railwaymetro_data_qingdao_stations_subway表示国铁和地铁车站。

06 坐标转换

当我们将画布扩大后,可以明显看到青岛市.geojson文件即青岛市区划范围与底图相比存在肉眼可见的坐标偏移,因此我们需要对其进行坐标转换,为此我们需要coord_covert库,安装后可在青岛市.geojson所在目录下用命令行执行coord_covert gcj2wgs 青岛市.geojson 青岛市-WGS-84.geojson进行转换。

叠加zoom=10的底图

叠加OpenStreetMap底图

番外

下面我们通过客流演示数据,用客流强度对线路linewidth分别赋值。